定义一个大小为 $n\times n$ 矩阵 $a$ 为魔法矩阵,当且仅当 $a$ 满足以下条件:
以下 $i,j,k\in \mathbb{Z^+}$
$\forall i\in[1,n],a_{i,i}=0$
$\forall i,j\in[1,n],a_{i,j}=a_{j,i}$
$\forall i,j,k\in[1,n],a_{i,j}\le\max(a_{i,k},a_{j,k})$
给你一个矩阵,问它是不是魔法矩阵。
如果 $a$ 是魔法矩阵输出 $\texttt{MAGIC}$,否则输出 $\texttt{NOT MAGIC}$,可以参见样例。
$1\leq n\leq 2500,\forall i,j\in[1,n],0\le a_{i,j}\le 10^9$
最小生成树:
咋一看和最小生成树一点关系都没有,但是我们设$a_{i,j}$表示$i$到$j$的边的边权为$a_{i,j}$,然后观察本题的三个条件:
$1.$对于每一个$i,j,a_{i,j}=a_{j,i}$(说明是无向图)
$2.$对于每个$i,a_{i,i}=0$(表示没有自环)
$3.$对于每个$i,j,k$,都有$a_{i,j}\leqslant max(a_{i,k},a_{k,j})$
第三个条件说明的就是最小生成树
我们可以设$f_{i,j}$为$i$到$j$的任意路径的最长边的最小值,可得$a_{i,j}\geqslant f_{i,j}.$
假设一个矩阵满足条件,则$a_{i,j}\leqslant max(a_{i,k_1}~,~a_{k_1,k_2}),a_{k_1,j}\leqslant max(a_{k_1,k_2},a_{k_2,j})\cdots\cdots$
$∴a_{i,j}\leqslant max(a_{i,k_1},a_{k_1,k_2},a_{k_2,k_3},\cdots,a_{k_m,j})$
$=f_{i,j}$
判断矩阵是否合法,就是判断图上的$i$到$j$的任意路径的最长边的最小值是否等于$a_{i,j}$.
这可以用最小生成树实现,模拟一遍$Kruskal$会更好理解,从最小的边开始加,形成环显然走已经形成的路更优,加边到形成树就保证图联通了就没必要加边了
判断合法即判断完全图中是不是任意一个生成树都是最小生成树
具体实现就是以任意一个节点(我使用$1$)为根,记录每个节点的父节点$fa$,然后找一个$y$,如下图,如果$max(a,b)<c$,那么就不符合最小生成树和题目给定条件了。
$Code$
1 |
|